package kr.co.cherryt.parser.common;


import java.util.Map;

import android.content.Context;
import android.view.ViewGroup;
import android.widget.ProgressBar;

public abstract class ItemParserBase {
	private Object m_objTag = null;

	public final static int E_SUCCESS = 0x0;
	public final static int E_BASE = 0x2000;
	public final static int E_PARSE_IO_EXCEPTION = 		E_BASE + 10;
	public final static int E_PARSE_JSON_EXCEPTION = 	E_BASE + 20;
	public final static int E_PARSE_UNKOWN_EXCEPTION = 	E_BASE + 30;
	public final static int E_PARSE_TIME_OUT  =		 	E_BASE + 40;
	
	public final static int DEFAULT_ASYNC_TIME_OUT = 15000;// 비동기 작업 기본 타임아웃 값 

	/**
	 * 부가적인 Data를 저장 할 수 있는 setter함수
	 * @param obj : 저장을 원하는 객체
	 */
	public void setTag(Object obj){
		m_objTag = obj;
	}

	/**
	 * 저장된 부가 Data를 리턴 
	 * @return
	 */
	public Object getTag(){
		return m_objTag;
	}
	
	
    /**
     * 파싱함수 (URL, URL 비동기, FILE, FILE 비동기)
     * @return : 비동기 작업의 경우 리턴 없음, 동기 작업의 경우 실패 성공 여부
     */
	abstract public boolean parseItemFromString(String szData);
	abstract public boolean parseItemFromUrl(String szUrl);
	abstract public void parseItemFromUrlAsync(String szUrl);
	
	abstract public boolean parseItemFromFile(String szFilePath,Context con);
	abstract public void parseItemFromFileAsync(String szFilePath,Context con);
 
    
	
	/**
     * 비동기 함수의 타임아웃 값을 설정
     * 해당 시간이 초과된 경우 onAsyncResult 함수를 사용해 오류를 전송  
     */
    abstract public void setAsyncTimeout(int nMilliSec);

    
    
    /**
     * 파싱과정을 통해 저장된 데이터를 초기화
     * @return : 데이터 초기화 도중 오류가 발생된 경우 false리턴 
     */
    abstract public boolean clear();
 
    
    
    /**
     * item Element의 갯수를 리턴
     */
    abstract public int getItemCount();
    /**
     * szKey를 가지고 있는 Element의 Value를 리턴 
     */
    abstract public String getItemValue(String szKey);

    /**
     * item에 데이터를 추가 
     * @return - 추가에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean addItemValue(String szKey, String szData);
    
    /**
     * item의 데이터를 제거 
     * @return - 삭제에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean removeItemValue(String szKey);
    
    /**
     * item의 데이터를 변경 
     * @return - 변경에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean setItemValue(String szKey, String szData);

    
    /**
     * itemArray의 데이터를 변경
     * @param nIdx - 변경할 Array의 Idx
     * @param szKey
     * @param szData
     * @return
     */
    //abstract public boolean setItemArrayValue(int nIdx, String szKey, String szData);
    
    
    
    /**
     * item_array Element의 갯수를 리턴
     */
    abstract public int getArrayItemCount();
    /**
     * nIdx번째 item_array 객체 중 szKey를 가지고 있는 Element의 Value를 리턴  
     */
    abstract public String getArrayItemValue(int nIdx, String szKey);


    /**
     * 배열의 특정 위치의 item을 Map 형식으로 반환 
     * Map으로 변환을 위한 비용이 추가되므로 필요한 경우에만 사용
     * @return - Map을 변환된 Item데이터, 오류가 발생된 경우 null 리턴
     */
    abstract public Map<String,String> getArrayItem(int nIdx);

    
    /**
     * 배열의 특정 위치에 item을 추가 
     * @return - 추가에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean insertArrayItem(int nIdx, Map<String,String> map);

    /**
     * 배열의 마지막 위치에 item을 추가 
     * @return - 추가에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean addArrayItem(Map<String,String> map);

    /**
     * 배열의 특정 index의 item을 제거 
     * @return - 제거에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean removeArrayItem(int nIdx);
    
    /**
     * 배열의 특정 위치의 item을 수정 (해당 key를 가진 데이터를 수정)
     * @return - 수정에 실패한 경우 false, 성공한 경우 true
     */
    abstract public boolean setArrayItemValue(int nIdx, String szKey, String szData);
    
   
    

    /**
     * 비동기 파싱의 결과를 전달하기 위한 Listener
     */
    public ParserInterfaceListener m_parserInterfaceListener;
    
    public void setParserInterfaceListener(ParserInterfaceListener l){
    	m_parserInterfaceListener = l;
    }
    
	public interface ParserInterfaceListener { 	
		public void onAsyncResult(int nErrcode, ItemParserBase obj);
	}
}

